package top.mcwebsite.playandroid.lib.markdown

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.intellij.markdown.flavours.MarkdownFlavourDescriptor
import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor
import org.intellij.markdown.parser.MarkdownParser
import top.mcwebsite.playandroid.lib.markdown.render.MarkdownState
import top.mcwebsite.playandroid.lib.markdown.render.RenderMap

@Composable
fun Markdown(
    input: String,
    modifier: Modifier = Modifier,
    flavor: MarkdownFlavourDescriptor = GFMFlavourDescriptor(),
) {
    val parsedTree = remember(input) {
        MarkdownParser(flavor).buildMarkdownTreeFromString(input)
    }
    val markdownState = remember(input) {
        MarkdownState(input)
    }
    Column(
        modifier = modifier
            .padding(bottom = 20.dp)
    ) {
//        items(parsedTree.children.size) {
        parsedTree.children.forEach {
            RenderMap(
                markdownState = markdownState, astNode = it
            )
        }
//        }
    }
}

internal val BlockVerticalPadding = 5.dp
internal val CodeBlockColor = Color.LightGray.copy(alpha = .5f)


@Preview(device = "spec:width=673dp,height=841dp", showBackground = true, backgroundColor = 0xFFFFFFFF)
@Composable
fun MarkdownPreview() {
    val text = """
        # Heading1
        ## Heading2
        ### Heading3
        #### Heading4
        ##### Heading5
        ###### Heading6

        settext heading1
        ===

        setext heading2
        ---

        这是一个正常的内容，什么都没有加

        这是一个加了斜体的内容，*斜体 `斜体中的代码块` *


        **粗体**， *斜体*
        
        这是第一行
        这是第二行
        
        我喜欢 `java`
        
        ```java
        public class Main {
            public static void main(String[] args) {
                System.out.println("Hello World!");
            }
        }
        ```
        
        ># Block Quote H1
        >HHHHH
        >**粗**，*斜*
        
        ## Markdow 简介
        
        > Markdown 是一种轻量级标记语言，它允许人们使用易读易写的纯文本格式编写文档，然后转换成格式丰富的HTML页面。    —— [维基百科](https://zh.wikipedia.org/wiki/Markdown)
        
        ### 复选框
        
        使用 `- [ ]` 和 `- [x]` 语法可以创建复选框，实现 todo-list 等功能。例如：
        
        - [x] 已完成事项
        - [ ] 待办事项1
        - [ ] 待办事项2
        
        ### 图片
        
        ![美女](https://ts1.cn.mm.bing.net/th/id/R-C.23034dbcaded6ab4169b9514f76f51b5?rik=mSGADwV9o%2fteUA&riu=http%3a%2f%2fpic.bizhi360.com%2fbbpic%2f40%2f9640_1.jpg&ehk=RYei4n5qyNCPVysJmE2a3WhxSOXqGQMGJcvWBmFyfdg%3d&risl=&pid=ImgRaw&r=0)
        
        ### 无序列表
        
        - Item1
        - Item2
        - Item3
        - Item4 Item4 Item4 Item4 Item4 Item4 Item4 Item4 Item4 Item4 Item4 Item4 
        
        - Item1
            Item 1 的内容
            - Item1 的 Item1
            - Item1 的 Item2
                - Item1 的 Item2 的 Item1
        - Item2
            - Item2 的 Item1
        ### 有序列表
        
        按照顺序
        
        1. Item1
        2. Item2
        
        不按顺序
        
        1. Item1
        2. Item2
        4. Item3
        8. Item4
        
        1. Item1
            1. Item1 的 Item1
                1. Item1 的 Item1 的 Item1
                2. Item1 的 Item1 的 Item2
                    1. Item1 的 Item1 的 Item2 的 Item1
            2. Item1 的 Item2
        2. Item2
        
        ### 表格
        
        | Item      |    Value | Qty  |
        | :-------- | --------:| :--: |
        | Computer  | 1600 USD |  5   |
        | Phone     |   12 USD |  12  |
        | Pipe      |    1 USD | 234  |
        
        ### 分割线
        
        ------
    """.trimIndent()
    val mutableText = remember {
        mutableStateOf(text)
    }
    Markdown(
        mutableText.value,
    )
}
